#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<thread>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;

#define NUM 10

class ThreadData
{
public:
    ThreadData(){}

    void Init(string name, int a, int b)
    {
        _name = name;
        _a = a;
        _b = b;
    }
    void Excute()
    {
        _result = _a + _b;
    }
    int Result(){return _result;}
    string Name(){return _name;}
    void SetId(pthread_t tid){_tid = tid;}
    pthread_t Id(){return _tid;}

    ~ThreadData(){}

private:
    string _name;
    int _a;
    int _b;
    int _result;
    pthread_t _tid;
};

string ToHex(pthread_t tid)
{
    char buff[64];
    snprintf(buff, sizeof(buff),"0x%lx",tid);
    return buff;
}

void* routine(void* args)
{
    ThreadData* td = static_cast<ThreadData*>(args);
    while(true)
    {
        cout<<"我是新线程，名字："<<td->Name()<<",tid:"<<ToHex(pthread_self())<<endl;
        td->Excute();
        break;
    }
    return td;
}

int main()
{
    ThreadData td[NUM];
    //初始化线程数组
    for(int i = 0; i < NUM; i++)
    {
        char buffer[64];
        snprintf(buffer, sizeof(buffer),"Thread-%d",i);
        td[i].Init(buffer,i*10,i*20);
    }
    //分配线程
    for (size_t i = 0; i < NUM; i++)
    {
        pthread_t id;
        //最后一个参数是routine回调函数的参数
        pthread_create(&id, nullptr, routine, &td[i]);
        td[i].SetId(id);
    }
    //等待线程
    for (size_t i = 0; i < NUM; i++)
    {
        pthread_join(td[i].Id(), nullptr);
    }
    //汇总结果
    for(int i = 0; i < NUM; i++)
    {
        printf("td[%d]:ant=%d[%ld]\n",i,td[i].Result(),td[i].Id());
    }
    return 0;
}























// //新线程
// void* run(void* args)
// {
//     while(1)
//     {
//         cout<<"new thread"<<endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// void threadfunc()
// {
//     while(1)
//     {
//         cout<<"我是子线程"<<endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     // pthread_t tid;
//     // pthread_create(&tid, nullptr, run, (void*)"thread-l");

//     // //主线程
//     // while(1)
//     // {
//     //     cout<<"main thread"<<endl;
//     //     sleep(1);
//     // }

//     thread t(threadfunc);

//     while(1)
//     {
//         cout<<"我是主函数"<<endl;
//         sleep(1);
//     }
//     return 0;
// }